package bbs.controller;

import bbs.exception.ControllerException;
import bbs.model.Board;
import bbs.model.User;
import bbs.service.BoardService;
import bbs.service.UserService;
import bbs.utils.Constant;
import bbs.utils.GraphicHelper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * @author ljg;
 * @create 2022-06-08 12:27
 */
@Controller
public class LoginController {
    @Autowired
    UserService userService;
    @Autowired
    BoardService boardService;

    /**
     * 使用 用户名和密码登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 根据用户名和密码获取到 用户对象
     */
    @RequestMapping("/login")
    public String login(@RequestParam("userName") String username,
                        @RequestParam("password") String password,
                        @RequestParam("code") String code,
                        Map<String, Object> infos, HttpSession session) {
        try {
            String s = (String) session.getAttribute("code");
            //判断验证码
            if (code.equalsIgnoreCase(s)) {
                User login = userService.login(username, password);
                //判断 用户不存在
                if (Objects.isNull(login)) {
                    infos.put(Constant.LOGIN_MASSAGE, "用户不存在！！！");
                } else if (Objects.isNull(login.getUserId())) {
                    //此时 表示Service返回的是一个new User() 说明 是一个新的用户
                    infos.put(Constant.LOGIN_MASSAGE, "用户名或密码错误");
                } else if (login.getLocked().equals(1)) {
                    //此时表示用户被锁定 （1:锁定，0:未锁定）
                    infos.put(Constant.LOGIN_MASSAGE, "用户被锁定");
                }
                //如果 用户登录有问题，就直接跳转到 login 页面
                if (infos.containsKey(Constant.LOGIN_MASSAGE)) {
                    return "login";
                } else {
                    //此时表示用户登录没有问题，将用户添加到 session 中,
                    // 用户登录成功 跳转到 index 主页
                    session.setAttribute("user", login);
                    return "forward:indexController";
                }
            } else {
                //此时表示验证码错误
                infos.put(Constant.LOGIN_MASSAGE, "验证码错误");
                return "login";
            }
        } catch (Exception e) {
            throw new ControllerException(e);
        }
    }

    /**
     * 访问主页 登陆成功之后 跳转（使用转发）
     * 主页 由所有版块构成
     *
     * @param requestData
     * @return
     */
    @RequestMapping("/indexController")
    public String index(Map<String, Object> requestData) {
        List<Board> boards = boardService.loadAllBoard();
        System.out.println("index###.");
        requestData.put("boardList", boards);
        System.out.println("index###... ");
        return "index";
    }

    /**
     *  验证码
     *
     * @param response
     * @param session
     */
    @RequestMapping("/validCode")
    public void validCode(HttpServletResponse response, HttpSession session) {
        try {
            //随机生成 四位数的验证码（使用字母和数字）
            String s = GraphicHelper.create(4, false, 180, 50, response.getOutputStream(), 1000);
            //通过响应将内容返回
            System.out.println(s);
            session.setAttribute("code", s);
            System.out.println("验证码为："+ session.getAttribute("code"));
        } catch (IOException e) {
            throw new ControllerException(e);
        }
    }

    /**
     * 登出
     * 需要 废弃session
     * @param session
     * @return
     */
    @RequestMapping("/logout")
    public String logout(HttpSession session){
        //废弃session
        session.invalidate();
        return "login" ;
    }

}
